草庐IT

Java OutOfMemoryError 奇怪的行为

全部标签

c++ - 这段代码,为什么它必须显示未定义的行为?

根据[lex.phases]1.2中的这句话Exceptforsplicesrevertedinarawstringliteral,ifaspliceresultsinacharactersequencethatmatchesthesyntaxofauniversal-character-name,thebehaviorisundefined.下面的代码片段有未定义的行为(live-example):#include//Accordingto[lex.phases]1.2thishasundefinedbehaviorconstchar*p="\\u0041";intmain(){st

c++ - 哪些枚举值在 C++14 中是未定义的行为,为什么?

标准中的脚注暗示任何枚举表达式值都是已定义的行为;为什么Clang的未定义行为sanitizer程序会标记超出范围的值?考虑以下程序:enumA{B=3,C=7};intmain(){Ad=static_cast(8);returnd+B;}theundefinedbehaviorsanitizer下的输出是:$clang++-5.0-fsanitize=undefined-ggdb3enum.cc&&./a.outenum.cc:5:10:runtimeerror:loadofvalue8,whichisnotavalidvaluefortype'A'请注意,错误不在static_c

c++ - 奇怪的错误:在没有真正创建指针时使用已删除的函数 'std::unique_ptr<_Tp, _Dp>::unique_ptr

我有一个类,看起来像这样:templateusingVectorPtr=std::vector>;templateusingVectorRawPtr=std::vector;classItemsSet{//&items);~ItemsSet()=default;VectorRawPtrGetItems();VectorRawPtrGetSuitableItemsForPeriod(constIPeriod&period);doubleCalculateTotal();private:VectorPtr_items;};构造函数看起来像:ItemsSet::ItemsSet(Vector

c++ - `C == C++` 是未定义的行为吗?

一个friend告诉我:intC=anything;C==C++将具有值true.这是一个玩笑,是对经常声称的“C与C++不同”的一种反驳。但是,由于==不是序列点,我认为这实际上是未定义的行为。该程序可能首先评估C++,所以C>C++和C==C++都是未定义的。然而,C>=C++将始终评估为真。当然,翻转操作数时也是如此(C++始终为真,其他所有内容均未定义)。这个分析是否正确? 最佳答案 所有情况都导致undefinedbehavior和不可预测的结果。draftC++11standard告诉我们,除非另有说明,否则操作数的求值

C++:函数重新声明是未定义的行为吗?

代码:#includeusingnamespacestd;intf(intx=0){coutOutput(在g++5.1上测试):x:0x:1我的问题:intf(intx=1);是声明还是定义?这样的函数重新声明是未定义的行为吗? 最佳答案 来自dcl.fct.default中的§8.3.6|:Fornon-templatefunctions,defaultargumentscanbeaddedinlaterdeclarationsofafunctioninthesamescope.Declarationsindifferentsc

c++ - 当 auto 遇到多态和虚函数时,正确的行为是什么?

classB{public:virtualvoidf(){printf("B\n");}};classD:publicB{public:voidf(){printf("D\n");}};intmain(void){B*d=newD();d->f();autob=*d;b.f();}对于d->f();,输出是D。这是正确的。但是对于b.f();,输出是B。这样对吗? 最佳答案 Isthisright?没错,类型是在编译时推导的。auto使用与templateargumentdeduction相同的规则对于类型推导,基于静态类型,不考虑

c++ - vector::erase 和 std::remove_if 的奇怪行为,其结束范围不同于 vector.end()

我需要从std::vector的中间移除元素。所以我尝试了:structIsEven{booloperator()(intele){returnele%2==0;}};intelements[]={1,2,3,4,5,6};std::vectorints(elements,elements+6);std::vector::iteratorit=std::remove_if(ints.begin()+2,ints.begin()+4,IsEven());ints.erase(it,ints.end());在此之后,我希望intsvector具有:[1,2,3,5,6]。在VisualSt

c++ - Linux、Mac OS X 和 Windows 之间不同的数学舍入行为

你好,我开发了一些混合的C/C++代码,并进行了一些密集的数值计算。当在Linux和MacOSX中编译时,我在模拟结束后得到非常相似的结果。在Windows中,该程序也可以编译,但我得到的结果却截然不同,有时该程序似乎无法运行。我在所有系统中都使用了GNU编译器。有friend推荐我加上-frounding-math,现在windows版本好像运行更稳定了,但是Linux和OsX,他们的结果,一点都没有变。您能否推荐其他选项以在Win和Linux/OSX版本之间获得更多一致性?谢谢PD我还尝试了-O0(无优化)并指定了-m32 最佳答案

c++ - 奇怪的 C++ 模板和常量问题

我不明白为什么这个程序的输出是第二种方法而不是第一种方法...#includetemplatevoidassign(T&t1,T&t2){std::coutvoidassign(T&t1,constT&t2){std::cout但是,当我将我的主要功能更改为:intmain(){Aa=1;constAb=2;Ac=a+b;assign(a,c);}输出是第一种方法。有什么想法吗? 最佳答案 assign(a,a+b);a+b的结果是A类型的右值表达式创建一个临时的,你不能将它绑定(bind)到一个非常量引用,所以它会选择const重

C++ 和 printf - 奇怪的字符输出

我是C++的新手,但不是Java、C#、JavaScript和VB。我正在使用VisualStudio2010中的默认C++控制台应用程序。在尝试执行printf时,我得到了一些奇怪的字符。每次都不一样,这告诉我每次运行时他们可能会查看不同的内存位置。代码:#include"stdafx.h"#includeusingnamespacestd;classPerson{public:stringfirst_name;};int_tmain(intargc,_TCHAR*argv[]){charsomechar;Personp;p.first_name="Bruno";printf("He